<template>
	<view>
		<image class="icon-back" src="../../static/back.png" mode="aspectFit" @tap="sheep.$router.back()"
			stlye="padding: 12px;"></image>
		<!-- #ifdef H5 -->
		<swiper :style="'width: '+ windowWidth +'px; height: '+ windowHeight +'px; background-color: #000000;'"
			:vertical="true" @animationfinish="animationfinish" @change="change" :current="current"
			:indicator-dots="false" :duration="duration">
			<swiper-item v-for="(list,index) in dataList" :key="index">
				<view v-if="Math.abs(k-index)<=1">
					<view>
						<!-- 
						1.v-if：用于控制视频在节点的渲染数
						2.muted的默认值是 false，代表默认是禁音视频的
						3.http-cache默认开启视频缓存
						4.poster（封面（方案一））：这里的封面默认处理存储在阿里云的视频
						5.show-loading：这里默认去掉播放转圈的标志
						v-if="Math.abs(k-index)<=1"
						 -->
						<video v-if="isShow" :id="list._id+''+index" :loop="true" :muted="list.isplay" :controls="false"
							:http-cache="true" :page-gesture="false" :show-fullscreen-btn="false" :show-loading="false"
							:show-center-play-btn="false" :enable-progress-gesture="false" :src="list.src"
							@ended="ended" @click="tapVideoHover(list.state,$event)"
							@timeupdate="timeupdate($event,index)"
							:style="'width: '+ windowWidth +'px; height: '+ windowHeight +'px; background-color: #000000; z-index: -1;'"
							:poster="list.src+'?x-oss-process=video/snapshot,t_100,f_jpg'"></video>
						<!-- 
						1.这里是封面（方案二）：这里的封面可以自定义。
						2.也在代码中做了批注，两种方案可以共存，不会相互影响。
						-->
						<image v-if="!list.playIng" :src="list.src+'?x-oss-process=video/snapshot,t_100,f_jpg'"
							:style="'width: '+ windowWidth +'px; height: '+ windowHeight +'px; position: absolute;'"
							mode="aspectFit"></image>
					</view>
					<!-- 播放状态：pause 的时候就会暂停 -->
					<view class="videoHover" @click="tapVideoHover(list.state,$event)"
						:style="'width: '+ windowWidth +'px; height: '+ windowHeight +'px;'">
						<image v-if="list.state=='pause'" class="playState" src="/static/icon/bf.png"></image>
					</view>
					<view class="userInfo">
						<!-- 1.头像 -->
						<image @tap="sheep.$router.go('/pages/index/index')" class="userAvatar" :src="app().info.logo"
							mode="aspectFill"></image>
						<!-- 2.点赞 -->
						<view @click="toggleFabulous(list, index)"
							style="margin-top: 20px;position: relative;z-index: 99;">
							<view>
								<image v-if="!list.isFabulous" src="/static/icon/aixin4.png"
									style="width: 40px; height: 40px; "></image>
								<image v-else src="/static/icon/aixin3.png" style="width: 40px; height: 40px;"></image>
							</view>
							<text
								style="color: #FFFFFF; margin-top: 5px; font-size: 14px; text-align: center;font-weight: bold;">{{ list.like }}</text>
						</view>
						<!-- 4.分享 -->
						<view @click="share" style=" margin-top: 20px;">
							<image src="/static/icon/fenx.png" style="width: 40px; height: 40px;"></image>

						</view>
						<!-- 3.详情 -->
						<view class="comment" @tap="sheep.$router.go('/pages/goods/index?id=' + list.id)" style="margin-top: 20px;">
							<image src="@/static/icon/xq.png" style="width: 35px; height: 35px;"></image>
						</view>
					</view>

					<!-- 商品图片 -->
					<image class="video-img" :src="list.image" mode="aspectFit" :class="{ active: list.state!='pause' }"
						:style="{ bottom : videoImgBottom }" @load="shopImgOnload"></image>

					<!-- 最底下的文字部分 -->
					<view class="content">
						<view class="video-title">
							<view style="font-size:32rpx;margin-bottom: 12rpx;">{{ list.name }}</view>
							<view v-for="(item, index) in (list.params || [])" :key="'p' + index" class="sm">
								{{ item.title }}：{{ item.content }}
							</view>
						</view>
					</view>

					<!-- 进度条 -->
					<view v-if="k === index" @touchstart="touchstart" @touchmove="touchmove" @touchend="touchend"
						:style="'width: '+ (windowWidth - (windowWidth*0.10)) +'px; margin-left: '+ (windowWidth * 0.05) +'px; height: 40px; position: absolute; bottom: 10px;'">
						<!-- 不拖动情况下 -->
						<view>
							<!-- 1.底部背景进度条 -->
							<view
								:style="'width: '+ (windowWidth - (windowWidth*0.10)) +'px; margin-top: 18px; height: 5px; border-radius: 10px; background-color: #999999; opacity: 0.6;'">
							</view>
							<!-- 2.播放的进度条 -->
							<view v-if="!isTouch"
								:style="'width: '+ ((windowWidth - (windowWidth*0.10)) * progressBarPercent) +'px; position: absolute; top: 18px; height: 5px; border-radius: 10px; background-color: #e6e4e7; '">
							</view>
							<!--  -->
							<view v-if="isTouch"
								:style="'width: '+ (videoStartPositon + addPositon) +'px; position: absolute; margin-top: 18px; height: 5px; border-radius: 10px; background-color: #e6e4e7; '">
							</view>
						</view>
					</view>
				</view>
			</swiper-item>
		</swiper>
		<!-- #endif -->

		<cc-poster v-if="goodsInfo" ref="refPoster" :key="goodsInfo.id" :goodsInfo="goodsInfo"></cc-poster>
	</view>
</template>

<script>
	import sheep from '@/sheep';
	import app from '@/sheep/store/app';
	import ccPoster from '../goods/components/cc-poster/index.vue'
	// import userList from '../new_index/data.js'//这个是假数据
	let audo = uni.createInnerAudioContext()
	audo.loop = true
	export default {
		data() {
			return {
				sheep,
				app,
				windowWidth: 0,
				windowHeight: 0,
				platform: "",
				model: "",
				deleteHeight: 0,
				dataList: [],
				k: 0,
				oldVideo: "",
				voice: "",
				timeout: "",
				current: 0,
				boxStyle: { //视频，图片封面样式🌟💗
					'height': 0,
					'width': 0,
				},

				videoID: "",
				isShow: false,

				showPlay: false, //转轮显示控制
				rotates: 0, //转轮旋转角度
				rotateTime: "", //转轮递归事件控制
				xrotats: "",

				mpcleartime: "",

				isClick: false,

				changeTimeout: "",
				mptime: 0,
				mpstartTime: 0,

				duration: 500,
				// -- 进度条相关 -- start
				videoStartPositon: 0,
				progressBarPercent: 0,
				touchStartPosition: 0,
				addPositon: 0,
				timeduration: 0,
				isTouch: false,
				videoImgBottom: '50%',
				zanloading: false,
				likeids: [],
				goodsId: null
				// -- 进度条相关 -- end
			}
		},
		components: {
			ccPoster
		},
		watch: {
			async k(k, old_k) {
				// console.log(k, old_k)
				this.progressBarPercent = 0;
				// #ifndef MP
				this.clearToTime();
				// #endif
				this.isShow = false
				this.dataList[old_k].playIng = false //如果视频暂停，就加载封面
				this.dataList[old_k].isplay = true
				this.dataList[old_k].state = 'pause'
				console.log('预留第' + (old_k + 1) + '个视频：' + this.dataList[old_k]._id + '' + old_k)
				// 2.0版本已经去掉了下面这一句，视频不用暂停，只需要把声音禁止就行
				uni.createVideoContext(this.dataList[old_k]._id + '' + old_k, this)
					.stop() //如果视频暂停，那么旧视频停止，这里的this.dataList[old_k]._id + '' + old_k，后面加 old_k 是为了每一个视频的 id 值不同，这样就可以大程度的避免串音问题
				console.log('已经暂停 --> 第' + (old_k + 1) + '个视频～') //提示
				this.dataList[k].state = 'play'
				this.isShow = true
				this.xrotats = setTimeout(() => {
					this.showPlay = true;
					// #ifndef MP
					this.rotateX();
					// #endif
				}, 200)
				// #ifdef MP
				// 如果是小程序端
				clearTimeout(this.changeTimeout);
				this.dataList[k].isplay = false
				setTimeout(() => {
					this.dataList[k].playIng = true
				}, 250)
				if (this.mptime < 0.2) {
					this.changeTimeout = setTimeout(() => {
						uni.createVideoContext(this.dataList[this.k]._id + '' + this.k, this).play()
					}, 1400)
				} else {
					uni.createVideoContext(this.dataList[this.k]._id + '' + this.k, this).play()
				}
				// #endif
				// #ifdef H5
				this.dataList[k].isplay = true
				audo.src = this.dataList[k].src
				if (this.isClick) {
					setTimeout(() => {
						if (typeof WeixinJSBridge == "undefined") {
							setTimeout(() => {
								audo.play()
								uni.createVideoContext(this.dataList[k]._id + '' + k, this).seek(0)
								uni.createVideoContext(this.dataList[k]._id + '' + k, this).play()
								setTimeout(() => {
									this.dataList[k].playIng = true
								}, 650)
							}, 500)
						} else {
							WeixinJSBridge.invoke('getNetworkType', {}, e => {
								setTimeout(() => {
									audo.play()
									uni.createVideoContext(this.dataList[k]._id + '' + k, this)
										.seek(0)
									uni.createVideoContext(this.dataList[k]._id + '' + k, this)
										.play()
									setTimeout(() => {
										this.dataList[k].playIng = true
									}, 850)
								}, 200)
							})
						}
					}, 200)
				} else {
					audo.pause()
					this.dataList[k].state = 'pause'
					uni.createVideoContext(this.dataList[k]._id + '' + k, this).seek(0)
					uni.createVideoContext(this.dataList[k]._id + '' + k, this).pause()
				}
				// #endif
				var p = k + 1;
				console.log('预加载第' + (p + 1) + '个视频：' + this.dataList[p]._id + '' + p)
			}
		},
		computed: {
			goodsInfo() {
				return this.dataList[this.k]
			}
		},
		onLoad(options) {
			this.goodsId = options.id
			this.platform = uni.getSystemInfoSync().platform
			this.model = uni.getSystemInfoSync().model
			var model = this.model
			if (this.platform == 'ios' && (model !== 'iPhone6' || model !== 'iPhone6s' || model !== 'iPhone7' || model !==
					'iPhone8')) {
				this.deleteHeight = 0 //有 tabbar的 修改这里可以改变视频高度
			}
			this.windowWidth = uni.getSystemInfoSync().windowWidth
			this.windowHeight = uni.getSystemInfoSync().windowHeight
			this.boxStyle.width = this.windowWidth + 'px' //给宽度加px
			this.boxStyle.height = this.windowHeight - this.deleteHeight; //有 tabbar的 修改这里可以改变视频高度
			this.get() //刚进入页面加载数据
			// #ifndef MP
			this.rotateX();
			// #endif
		},
		onShow() {
			console.log('回到前台');
			if (this.dataList.length !== 0) {
				// #ifdef MP
				this.dataList[this.k].state = 'play';
				uni.createVideoContext(this.dataList[this.k]._id + '' + this.k, this).play()
				// #endif
				// #ifdef H5
				if (this.isClick) {
					this.dataList[this.k].state = 'play';
					uni.createVideoContext(this.dataList[this.k]._id + '' + this.k, this).play()
					audo.play()
				}
				// #endif
			}
		},
		unmounted() {
			console.log('到后台');
			// #ifdef MP
			this.dataList[this.k].state = 'pause';
			uni.createVideoContext(this.dataList[this.k]._id + '' + this.k, this).pause()
			// #endif
			// #ifdef H5
			if (this.isClick) {
				this.dataList[this.k].state = 'pause';
				uni.createVideoContext(this.dataList[this.k]._id + '' + this.k, this).pause()
				audo.pause()
			}
			// #endif
			console.log('到后台');
		},
		methods: {
			shopImgOnload(e) {
				const {
					width,
					height
				} = e.detail;
				uni.getSystemInfo({
					success: (res) => {
						const cWidth = res.windowWidth
						const cHeight = (cWidth * height) / width
						this.videoImgBottom = res.windowHeight / 2 - cHeight * 0.3333 + 'px'
					},
				});
			},
			mpTouchend() {
				this.mptime = (new Date() / 1000) - this.mpstartTime;
			},
			mpTouchstart() {
				this.mpstartTime = (new Date() / 1000);
			},
			dealVoice() {
				uni.showToast({
					title: '处理声音',
					icon: 'none'
				})
			},
			clearToTime() {
				//清理定时器
				for (let i = 0; i < 20; i++) {
					clearTimeout(this.rotateTime);
					clearTimeout(this.xrotats);
					this.showPlay = false;
					this.rotates = 0;
				}
			},
			clearTime() {
				//清理定时器
				for (let i = 0; i < 20; i++) {
					clearTimeout(this.rotateTime);
					clearTimeout(this.xrotats);
				}
			},
			rotateX() {
				// clearTimeout(this.rotateTime);
				this.rotateTime = setTimeout(() => {
					this.rotateX();
					this.showPlay = true;
					this.rotates += 1;
				}, 30)
			},
			closeScrollview() {
				// 点击评论里面的叉叉，就会关闭评论
				this.$refs.pinglun.close();
			},
			ended() {
				// 1.播放当前视频结束时触发，自动切换下一个视频
				// this.current = this.k+1
			},
			// ---- 进度条相关 --- start
			touchstart(e) {
				// console.log(e);
				this.isTouch = true;
				// #ifdef H5
				if (this.isClick) {
					this.addPositon = 0;
					this.videoStartPositon = (this.windowWidth - (this.windowWidth * 0.10)) * this.progressBarPercent;
					this.touchStartPosition = e.changedTouches[0].clientX;
				}
				// #endif
				// #ifdef MP
				this.addPositon = 0;
				this.videoStartPositon = (this.windowWidth - (this.windowWidth * 0.10)) * this.progressBarPercent;
				this.touchStartPosition = e.changedTouches[0].clientX;
				// #endif
			},
			touchmove(e) {
				// console.log(e);
				// #ifdef H5
				if (this.isClick) {
					let num = e.changedTouches[0].clientX - this.touchStartPosition;
					if ((this.videoStartPositon + num) <= (this.windowWidth - (this.windowWidth * 0.10))) {
						this.addPositon = e.changedTouches[0].clientX - this.touchStartPosition;
					} else {
						this.addPositon = 0;
						this.videoStartPositon = (this.windowWidth - (this.windowWidth * 0.10));
					}
				}
				// #endif
				// #ifdef MP
				let num = e.changedTouches[0].clientX - this.touchStartPosition;
				if ((this.videoStartPositon + num) <= (this.windowWidth - (this.windowWidth * 0.10))) {
					this.addPositon = e.changedTouches[0].clientX - this.touchStartPosition;
				} else {
					this.addPositon = 0;
					this.videoStartPositon = (this.windowWidth - (this.windowWidth * 0.10));
				}
				// #endif
			},
			touchend(e) {
				// #ifdef H5
				if (this.isClick) {
					let per = Number((this.videoStartPositon + this.addPositon) / (this.windowWidth - (this.windowWidth *
						0.10)));
					let timeSubmit = parseInt(this.timeduration * per)
					audo.seek(timeSubmit)
					audo.play()
					uni.createVideoContext(this.dataList[this.k]._id + '' + this.k, this).seek(timeSubmit)
					uni.createVideoContext(this.dataList[this.k]._id + '' + this.k, this).play()
					this.dataList[this.k].state = 'play'
					setTimeout(() => {
						this.isTouch = false;
					}, 500)
				}
				// #endif
				// #ifdef MP
				let per = Number((this.videoStartPositon + this.addPositon) / (this.windowWidth - (this.windowWidth *
					0.10)));
				let timeSubmit = parseInt(this.timeduration * per)
				audo.seek(timeSubmit)
				audo.play()
				uni.createVideoContext(this.dataList[this.k]._id + '' + this.k, this).seek(timeSubmit)
				uni.createVideoContext(this.dataList[this.k]._id + '' + this.k, this).play()
				setTimeout(() => {
					this.isTouch = false;
				}, 500)
				// #endif
			},
			timeupdate(event, index) {
				// 触发进度条更新
				// console.log(event,index);
				if (index === this.k) {
					this.timeduration = event.detail.duration;
					this.progressBarPercent = parseFloat(Number(event.detail.currentTime / event.detail.duration));
				}
			},
			// ---- 进度条相关 --- ending
			//点击播放&&暂停
			tapVideoHover(state, event) {
				console.log('state--', state);
				if (state == 'play' || state == 'continue') {
					this.dataList[this.k].state = 'pause';
				} else {
					this.dataList[this.k].state = 'continue';
				}
				if (this.dataList[this.k].state == 'continue') {
					this.isClick = true;
					this.dataList[this.k].playIng = true
					uni.createVideoContext(this.dataList[this.k]._id + '' + this.k, this).play(); //暂停以后继续播放
					// #ifdef MP
					this.dataList[this.k].isplay = false
					// #endif
					// #ifdef H5
					audo.play()
					// #endif
				}
				if (this.dataList[this.k].state == 'pause') {
					uni.createVideoContext(this.dataList[this.k]._id + '' + this.k, this).pause(); //暂停以后继续播放
					// #ifdef MP
					this.dataList[this.k].isplay = true
					// #endif
					// #ifdef H5
					audo.pause()
					// #endif
				}
			},
			change(event) {
				this.k = event.detail.current
			},
			animationfinish(event) {
				// 1.这里进行判断，如果是最后一个视频就进入 get() 方法加载视频进入列表
				if (this.k == this.dataList.length - 1) {
					this.GET()
				}
			},
			//每一组结束时新的请求
			GET() {
				// uni.request({
				// 	url: 'https://htglhy.huchengfireworks.com/goods.goods/video_list?id=' + this.goodsId,
				// 	method: 'POST',
				// 	header: {
				// 		seller: '3qlEca'
				// 	},
				// 	success: (res) => {
				// 		var msg = res.data.data
				// 		// 2.这里把视频添加到视频列表
				// 		for (let i = 0; i < msg.length; i++) {
				// 			this.dataList.push(msg[i])
				// 		}
				// 	}
				// })
			},
			get() {
				// 1.这里引入后端请求数据
				// var msg = userList
				// url: 'https://htglhy.huchengfireworks.com/goods.goods/video_list',
				// method: 'get',
				// header: {
				// 	seller:'3qlEca'
				// },

				sheep.$api.goods.getVideoGoodsList({
					id: this.goodsId
				}).then((res) => {
					if (res.code === 1) {
						this.isShow = false;
						var msg = res.data.map(item => {
							item.src = item.video
							item.isplay = true
							item._id = item.id
							return item
						})
						console.log(msg)
						// 2.这里把视频添加到视频列表
						for (let i = 0; i < msg.length; i++) {
							this.dataList.push(msg[i])
						}
						// 3.播放当前视频
						setTimeout(() => {
							this.isShow = true;
							// #ifdef H5
							this.dataList[this.k].isplay = true
							// #endif
							// #ifdef MP
							// 如果是小程序端
							this.dataList[this.k].isplay = false
							this.dataList[this.k].state = 'play'
							// #endif
							this.dataList[this.k].playIng = true
							setTimeout(() => {
								// #ifdef H5
								uni.createVideoContext(this.dataList[this.k]._id + '' +
									this.k, this).seek(0)
								uni.createVideoContext(this.dataList[this.k]._id + '' +
									this.k, this).pause()
								this.dataList[this.k].state = 'pause';
								audo.src = this.dataList[this.k].src;
								// #endif
								// #ifdef MP
								uni.createVideoContext(this.dataList[this.k]._id + '' +
									this.k, this).play()
								// #endif
							}, 500)
						}, 200)
						this.videoID = this.dataList[this.k]._id
					}
				})

			
			},
			share() {
				this.$refs.refPoster?.showModal()
			},
			toComment(index) {
				// 注意点击评论之后会执行这里
				/*
				（1）先加载缓冲
				（2）获取当前视频 ID 信息
				（3）🌟🌟🌟🌟重要🌟🌟🌟🌟
					- 一定要记得看 index.vue 里面
					 uni.setStorageSync("user",this.peopleList[i]);
					 这个东西，用于存储当前用户信息。在 插件里面会使用到这个东西，
					 记得写一下。
					 
				（4）打开评论
				*/
				uni.showToast({
					title: '加载中...',
					icon: 'none',
					position: 'bottom',
					duration: 300
				})
				uni.setStorageSync("videoID", this.dataList[index]._id);
				this.videoID = this.dataList[index]._id;
				this.$refs.pinglun.open('bottom')
			},
			toggleFabulous(item, index) {
				if (this.zanloading) return
				let type = 1
				if (this.likeids.includes(item.id)) type = 2
				this.zanloading = true
				sheep.$api.goods.like({
					id: item.id,
					type
				}).then(res => {
					this.$emit('fabulous', item, item.isFabulous ? false : true);
					if (type === 1) {
						this.likeids.push(item.id)
					} else {
						this.likeids.splice(index, 1)
					}
					let likeNum = item.like
					if (type === 1) likeNum++
					else likeNum--
					this.$set(this.videoList, index, Object.assign(item, {
						isFabulous: item.isFabulous ? 0 : 1,
						like: likeNum--,
						fabulousCount: item.isFabulous ? item.fabulousCount - 1 : item.fabulousCount +
							1,
					}));
				}).finally(() => {
					this.zanloading = false
				})
			}
		}
	}
</script>

<style lang="scss">
	.icon-back {
		position: absolute;
		top: 40rpx;
		left: 40rpx;
		z-index: 3;
		width: 50rpx;
		height: 50rpx;
	}

	.video-img {
		position: absolute;
		z-index: 2;
		width: 100%;
		right: 0;
		transition: all 1s;

		&.active {
			width: 200rpx;
			height: 200px;
			bottom: 20rpx !important;
			right: 20rpx;
		}
	}

	.container {
		background-color: #000000;
	}

	.item {
		/* width : 750rpx; */
		background-color: #000000;
		position: relative;
	}

	.videoHover {
		display: flex;
		position: absolute;
		top: 0;
		left: 0;
		flex: 1;
		background-color: rgba(0, 0, 0, 0.1);
		justify-content: center;
		align-items: center;
		z-index: 3;

		/* border-style: dashed;
		border-color: #DD524D;
		border-width: 1px; */
	}

	.playState {
		width: 90rpx;
		height: 90rpx;
	}

	.userInfo {
		position: absolute;
		bottom: 280px;
		right: 10px;
		flex-direction: column;
		text-align: center;
		z-index: 4;

	}

	.userAvatar {
		border-radius: 500%;
		margin-bottom: 15px;
		border-style: solid;
		border-width: 2px;
		border-color: #ffffff;
	}

	.userAvatar {
		width: 100rpx;
		height: 100rpx;
	}

	.likeIco,
	.shareIco,
	.commentIco {
		width: 60rpx;
		height: 60rpx;
		margin-top: 15px;
	}

	.likeNum,
	.commentNum,
	.shareTex {
		color: #ffffff;
		font-size: 30rpx;
		text-align: center;
		margin: 5px;
	}

	.likeNumActive {
		color: red;
	}

	.content {
		width: 620rpx;
		z-index: 99;
		position: absolute;
		bottom: 60px;
		/* justify-content: center; */
		padding: 20rpx 20rpx 20rpx 32rpx;
		flex-direction: column;
		justify-content: flex-start;
		color: #F0A881;
		font-size: 24rpx;

		.sm {
			color: rgba(#fff, 0.8);
			margin-bottom: 4rpx;
		}

		/* background-color: aqua; */
	}

	.userName {
		font-size: 30rpx;
		color: #ffffff;
		margin-top: 80upx;
	}

	.words {
		margin-top: 10rpx;
		font-size: 30rpx;
		color: #ffffff;
	}

	.root {
		background-color: #000000;
	}
</style>